ICTSC2019 一次予選 問題解説: 監視できない!
問題名
監視できない!
問題文
あなたは新しくkubernetesのクラスタを構築しました。そして、クラスタの情報を取得するためにnotifierというアプリケーションを作りました。このアプリケーションは自身がデプロイされたクラスタのPodに関するイベントを外部のサーバにwebhookする機能を持っています。
さて、そのアプリケーションをデプロイしてRunningと表示されるのですが、なぜかイベントを見ることが出来ません。なんとかしてイベントを見れるようにしてください。
条件
- notifierのイメージを変更してはいけない。
- notifierはkubernetesの内部に設置する必要がある。
- default namespaceに別のPodをデプロイする際に、デフォルトで権限を与えすぎないようにする必要がある。
ゴール
miscサーバでlocalhostにcurlすると、最新のイベントが確認できる。
各マシンの説明
k8s
kubernetesが動作しているマシン。kubernetesの上ではnotifierが動作している。また、/manifestsにはnotifierをデプロイする際に使用したマニフェストが保存されている。
- IPアドレス: 192.168.0.1
- ユーザ名: admin
- パスワード: kkkkkkkks
misc
Docker Registryやwebappなどが動作しているマシン。
- IPアドレス: 192.168.0.201
- ユーザ名: admin
- パスワード: kkkkkkkks
各アプリケーションの説明
notifier
kubernetes上で動作しているアプリケーション。kubernetesのPodリソースを監視し、作成, 変更, 削除があった場合には http://misc/webhook にイベント情報を飛ばす。
webapp
misc上で動作しているWebhookを受け取るアプリケーション。notifierから受け取った最新10件のイベント情報を http://misc で公開している。
解説
踏み台サーバを経由してmiscサーバに入りcurl http://misc
を実行してみると、確かにログが1件も見えていないことが分かります。
その次に、k8sサーバに入りkubectl get pods
, kubectl logs ${POD_NAME}
等のコマンドでnotifierのログを見てみます。
条件にもある通り、default namespaceにデプロイされるコンテナに不必要な権限が与えられてしまってはいけないので、まず初めにnotifier用のService Accountを作成します。
notifierが新しく作成したService Accountを使用するようにDeploymentにも変更を加えます。
次に、このService Accountに対し、notifierで必要とされる権限を付与していきます。何度かlogを見ながら試行錯誤していくと、podsに対するlist権限とwatch権限が必要だと分かるので、その2つをnotifierに付与します
最後に想定回答を示します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
— | |
apiVersion: v1 | |
kind: ServiceAccount | |
metadata: | |
name: notifier | |
namespace: default | |
— | |
apiVersion: apps/v1 | |
kind: Deployment | |
metadata: | |
name: notifier | |
labels: | |
app: notifier | |
spec: | |
replicas: 1 | |
selector: | |
matchLabels: | |
app: notifier | |
template: | |
metadata: | |
labels: | |
app: notifier | |
spec: | |
serviceAccountName: notifier | |
hostAliases: | |
– ip: “192.168.0.201” | |
hostnames: | |
– “misc” | |
containers: | |
– name: notifier | |
image: misc:5000/notifier | |
— | |
apiVersion: rbac.authorization.k8s.io/v1 | |
kind: ClusterRole | |
metadata: | |
name: pod-watcher | |
rules: | |
– apiGroups: [“”] | |
resources: [“pods”] | |
verbs: [“list”, “watch”] | |
— | |
apiVersion: rbac.authorization.k8s.io/v1 | |
kind: ClusterRoleBinding | |
metadata: | |
name: notifier | |
subjects: | |
– kind: ServiceAccount | |
name: notifier | |
namespace: default | |
roleRef: | |
kind: ClusterRole | |
name: pod-watcher | |
apiGroup: rbac.authorization.k8s.io |